package com.atguigu.gmall.mq.consumer;

import com.rabbitmq.client.Channel;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

import java.io.IOException;

/**
 * @Author: 李旭
 * @Time: 14:36
 * @Description: 消费方
 */
@RabbitListener(queues = "queue1")
@Component
public class Consumer {

    //接收消息  手动应答  1百万   2次 不能消费此消息  记录在日志中 人为参与完成
    @RabbitHandler
    public void receiverMessage(String msg, Message message, Channel channel) {
        try {
            System.out.println(msg);
            int i = 1/0;
            //应答成功接收消息
            //long deliveryTag : 消息的标识
            //multiple的true  批量应答 和false 只应答当前
            channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
        } catch (Exception e) {
            //e.printStackTrace();
            //当前此消息是否为再投递的消息
            if(message.getMessageProperties().isRedelivered()){
                //第二次  再投递的消息
                System.out.println("当前消息是第二次投递");
                //参数2：是否放回队列 （给一次重新发送的机会）
                try {
                    channel.basicReject(message.getMessageProperties().getDeliveryTag(),false);
                    //记录日志  人为干扰
                } catch (IOException ex) {
                    ex.printStackTrace();
                }
            }else{
                //第一次
                System.out.println("当前消息是第一次投递");
                try {
                    //否定确认
                    //long deliveryTag : 消息的标识
                    //multiple的true  批量应答 和false 只应答当前
                    //参数3：是否放回队列 （给一次重新发送的机会）
                    channel.basicNack(message.getMessageProperties().getDeliveryTag(),
                            false,true);
                } catch (IOException ex) {
                    ex.printStackTrace();
                }
            }
        }
    }
}
